package com.nd.android.musicboxlibrary.ui.common;

import android.app.Activity;
import android.support.v4.app.Fragment;
import android.view.View;
import com.nd.android.musicboxlibrary.BuildConfig;
import com.nd.android.musicboxlibrary.util.Log;

import java.lang.reflect.Field;

/**
 * 利用java反射功能 执行控件注射
 * 
 * @author davidleen29
 */

public final class ViewInjectorWithReflect {

    /**
     * Creates a new instance of ViewInjectorWithReflect. <br>
     * Created 2014年9月15日 下午11:11:31
     */
    private ViewInjectorWithReflect() {
    }

    /**
     * 执行View 与 控件索引对象 关联 执行注入的对象 成员名称 必须与 View 的子控件的 id 一致
     * 
     * @param obj Object
     * @param v View
     */
    public static void injectView(Object obj, View v) {

        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {

            field.setAccessible(true);
            int id = v.getResources().getIdentifier(field.getName(), "id",
                    v.getContext().getPackageName());
            if (id <= 0) {
                if (BuildConfig.DEBUG) {
                    Log.e("injectView",
                            "field: "
                                    + field.getName()
                                    + "  no found the relative id for the field name  please ensure the field name ,"
                                    + "it must equals to a id name ");
                }
            } else {

                try {
                    field.set(obj, v.findViewById(id));
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            field.setAccessible(false);

        }

    }

    /**
     * 执行View 与 控件索引对象 关联 执行注入的对象 成员名称 必须与 View 的子控件的 id 一致
     * 
     * @param obj Object
     * @param act Activity
     */
    public static void injectView(Object obj, Activity act) {

        injectView(obj, act.getWindow().getDecorView());

    }

    /**
     * 执行View 与 控件索引对象 关联 执行注入的对象 成员名称 必须与 View 的子控件的 id 一致
     * 
     * @param obj Object
     * @param frament Fragment 对象
     */
    public static void injectView(Object obj, Fragment frament) {

        injectView(obj, frament.getView());

    }
}
